<?php
class ManageNewsController extends AppController {
	/**
	 @var $name
	 @brief Tên của controller
	 */
	var $name = 'ManageNews';
	
	/**
	 @var $components
	 @brief Danh sách tất cả các Component được sử dụng trong controller
	 */
	var $components = array('RootHandler', 'MultiFileUpload');
	
	/**
	 @var $uses
	 @brief Danh sách tất cả các model được sử dụng trong controller
	 */
	var $uses = array('news.News', 'news.NewsCategory', 'access_logs.AccessLog');
	
	/**
	 @var $helpers
	 @brief Danh sách tất cả các Helper được sử dụng trong view
	 */
	var $helpers = array('Form','Wysiwyg');
	
	/**
	 @var $category_root_id
	 @brief Id của danh mục gốc của hệ thống quản lý trang
	 */
	var $category_root_id = null;
	
	
	function beforeFilter() {
		parent::beforeFilter();
		$this->configs = $this->News->loadConfig();
		$this->AccessLog->currentUser = $this->user;
		// Get root category of news
		$this->RootHandler->startup($this);
		// ?
		$this->RootHandler->chRoot('news.root_id', array('categoryName' => 'NewsCategory'));
		
		// Nếu không có root category thì gán nó là danh mục đầu tiên tìm được
		if (!isset($this->params['named']['root']) || empty($this->params['named']['root'])) {
			$firstCat = $this->NewsCategory->find('first', array(
				'contain'	=>	array(),
				'conditions'	=> array(
					'parent_id'	=> $this->configs['Category']['root_id']
				)
			));
			
			$this->category_root_id = $firstCat['NewsCategory']['id'];
			$this->params['named']['root'] = $firstCat['NewsCategory']['alias'];
		}
		$this->set('configs', $this->configs);
	}
	
	/**
	 * ----------- Manage của editable page ------------------
	 */
	

	/**
	 * Hành động liệt kê ra danh sách các trang, có phân trang
	 */
	function index() {
		// Get categories
		if ($this->category_root_id) {
			$category = $this->NewsCategory->find('first', array(
				'contain'	=> array(),
				'conditions' => array(
					'NewsCategory.id'	=> $this->category_root_id
				)
			));
		}
//		$this->configs['View']['limit'] = 1;
		$pages = $this->News->getList($this, array('News.created', 'News.special', 'News.priority', 'News.news_date', 'News.is_published'), $this->configs);
		$this->set(compact('pages', 'category'));
	}
	
	/**
	 * Phương thức được sử dụng để tạo mới một trang, bao gồm hiển thị form nhập liệu và xử lý các thông tin nhập liệu đó
	 */
	function add() {
		if (empty($this->data)) {
			// load dữ liệu trong trường hợp phát sinh lỗi
			$this->__checkError('News');
			
			$nodes = $this->NewsCategory->children($this->category_root_id, false, array('id','name','lft','rght','parent_id'));
			$tree = $this->NewsCategory->transformToTree($nodes);
			$this->set('categories', $tree);
			$this->set('category_root_id', $this->category_root_id);
			
		} else {
			try {
				// Create Category Information
				$this->data = $this->News->validateData($this->data);
			} catch (Exception $ex) {
				$this->__setError('News');
				$this->Session->setFlash($ex->getMessage(), "flash_error");
				$this->redirect("/".$this->params['url']['url']);
			}
			
			// Xử lý với image
			$image = "";
			//debug($this->data);exit;
			if (isset($this->configs['News']['image']['show']) && $this->configs['News']['image']['show']) {
				$this->MultiFileUpload->encode_filename = false;
				$this->MultiFileUpload->uploadpath = $this->configs['News']['image']['path'];
				if (isset($this->configs['News']['upload']) && isset($this->configs['News']['upload']['AttachTypeAllowed'])) {
					$this->MultiFileUpload->_properties['AttachTypeAllowed'] = $this->configs['News']['upload']['AttachTypeAllowed'];
				}
				
				$imgRet = array();
				try {
					$imgRet = $this->MultiFileUpload->upload();
				} catch (Exception $ex) {
					$this->Session->setFlash($ex->getMessage(), "flash_error");
					$this->redirect(array(
						'action'	=> 'index',
						'root'		=>	$this->params['named']['root']
					));
				}

				if (count($imgRet) && isset($imgRet['image']['image'])) {
					// assign name to image field.
					$this->data['News']['image'] = $imgRet['image']['image'];
					
					App::import('Vendor','images/my_image'); 
					$thumbnail_dir = $this->configs['News']['thumbnail']['path'];
					
					// Nếu chế độ là tự động resize, tiến hành resize
					$my_image = new my_image($this->MultiFileUpload->uploadpath.$imgRet['image']['image']);
					if (isset($this->configs['News']['image']['autoResize']) && $this->configs['News']['image']['autoResize']) {
						// resize image
						$my_image->thumbnail(
							$this->configs['News']['image']['width'],
							$this->configs['News']['image']['height'],
							$this->configs['News']['image']['percent']
						);
						$my_image->copyTo($this->MultiFileUpload->uploadpath.$imgRet['image']['image']);
					}
					
					
					if (!is_dir($thumbnail_dir)) {
						mkdir($thumbnail_dir);
					}
					// create thumbnail
					$my_image->thumbnail(
						$this->configs['News']['thumbnail']['width'],
						$this->configs['News']['thumbnail']['height'],
						$this->configs['News']['thumbnail']['percent']
					);
					
					$ext = strrchr($imgRet['image']['image'], ".");
					$pos = strrpos($imgRet['image']['image'], ".");
					$filename = substr($imgRet['image']['image'],0,$pos);
					$thumbnail_name = $filename."_thumbnail".$ext;
					$my_image->copyTo($thumbnail_dir.$thumbnail_name);

					$image = $imgRet['image']['image'];
				}
			}
			
			$this->News->create($this->data);
			if ($this->News->save($this->data)) {
				// Ghi xuống log
				$this->AccessLog->writeLog(__("Tạo mới tin", true), __("Tin tức", true));
				
				$this->Session->setFlash(__("Bài viết đã được tạo mới thành công!", true), "flash_success");
				$this->redirect(array(
					'action'	=> 'index',
					'root'		=>	$this->params['named']['root']
				));
			} else {
				if (isset($this->configs['News']['image']['show']) && $this->configs['News']['image']['show']) {
					// Delete uploaded image
					$this->News->delete_image($image, $this->configs);
				}
				$this->__setError('News');
				$this->Session->setFlash(__("Không thể lưu thông tin bài viết. Bạn vui lòng thử lại!", true), "flash_error");
				$this->redirect("/".$this->params['url']['url']);
			}
		}
	}
	
	/**
	 * Phương thức được sử dụng để chỉnh sửa thông tin một trang, bao gồm hiển thị form nhập liệu và xử lý các thông tin nhập liệu đó
	 * @param $id ID của trang cần chỉnh sửa
	 */
	function edit($id=null) {
		if (empty($this->data)) {
			$this->data = $this->News->read(null, $id);

			// load dữ liệu trong trường hợp phát sinh lỗi
			$this->__checkError('News');
			
			$nodes = $this->NewsCategory->children($this->category_root_id, false);
			$tree = $this->NewsCategory->transformToTree($nodes);
			$this->set('categories', $tree);
			$this->set('category_root_id', $this->category_root_id);
		
		} else {
			try {
				// Create Category Information
				$this->data = $this->News->validateData($this->data);
			} catch (Exception $ex) {
				$this->__setError('News');
				$this->Session->setFlash($ex->getMessage(), "flash_error");
				$this->redirect("/".$this->params['url']['url']);
			}
			
			// Xử lý hình ảnh
			$image = "";
			if (isset($this->configs['News']['image']['show']) && $this->configs['News']['image']['show']) {
				$oldImage = "";
				$this->MultiFileUpload->encode_filename = false;
				$this->MultiFileUpload->uploadpath = $this->configs['News']['image']['path'];
				if (isset($this->configs['News']['upload']) && isset($this->configs['News']['upload']['AttachTypeAllowed'])) {
					$this->MultiFileUpload->_properties['AttachTypeAllowed'] = $this->configs['News']['upload']['AttachTypeAllowed'];
				}
				
				$imgRet = array();
				try {
					$imgRet = $this->MultiFileUpload->upload();
				} catch (Exception $ex) {
					$this->Session->setFlash($ex->getMessage(), "flash_error");
					$this->redirect(array(
						'action' => 'index',
						'root'		=>	$this->params['named']['root']
					));
				}
				
				if (count($imgRet) && isset($imgRet['image']['image'])) {
					// assign name to image field.
					$this->data['News']['image'] = $imgRet['image']['image'];
					App::import('Vendor','images/my_image'); 
					$thumbnail_dir = $this->configs['News']['thumbnail']['path'];
					
					$my_image = new my_image($this->MultiFileUpload->uploadpath.$imgRet['image']['image']);
					if (isset($this->configs['News']['image']['autoResize']) && $this->configs['News']['image']['autoResize']) {
						
						// resize image
						$my_image->thumbnail(
							$this->configs['News']['image']['width'],
							$this->configs['News']['image']['height'],
							$this->configs['News']['image']['percent']
						);
						$my_image->copyTo($this->MultiFileUpload->uploadpath.$imgRet['image']['image']);
					}
					
					if (!is_dir($thumbnail_dir)) {
						mkdir($thumbnail_dir);
					}
					// create thumbnail
					$my_image->thumbnail(
						$this->configs['News']['thumbnail']['width'],
						$this->configs['News']['thumbnail']['height'],
						$this->configs['News']['thumbnail']['percent']
					);
					
					$ext = strrchr($imgRet['image']['image'], ".");
					$pos = strrpos($imgRet['image']['image'], ".");
					$filename = substr($imgRet['image']['image'],0,$pos);
					$thumbnail_name = $filename."_thumbnail".$ext;
					$my_image->copyTo($thumbnail_dir.$thumbnail_name);
					
					$image = $imgRet['image']['image'];
					
					// Get Old Image
					$oldImage = $this->News->field('image');
				}
			}	
			if ($this->News->save($this->data)) {
				if (isset($this->configs['News']['image']['show']) && $this->configs['News']['image']['show']) {
//					// delete old image
					$this->News->delete_image($oldImage,$this->configs);
				}
				// Save Extra Fields
				
				// Related Pages
				$this->Session->setFlash(__("Bài viết đã được cập nhật thành công!", true), "flash_success");
				$this->redirect(array(
					'action'	=> 'edit',
					$id,
					'root'		=>	$this->params['named']['root']
				));
			} else {
				if (isset($this->configs['News']['image']['show']) && $this->configs['News']['image']['show']) {
					// Delete uploaded image
					$this->News->delete_image($image, $this->configs);
				}
				$this->__setError('News');
				
				$this->Session->setFlash(__("Không thể cập nhật thông tin bài viết. Bạn vui lòng thử lại", true), "flash_error");
				
				// Redirect to current page for refreshing
				$this->redirect("/".$this->params['url']['url']);
			}
		}
	}
	
	/**
	 * Hành động delete được sử dụng để xóa 1 trang, bao gồm thông tin dữ liệu của trang và các thông tin liên quan như hình ảnh, dữ liệu liên quan, ...
	 * @param $id ID của trang cần xóa
	 */
	function delete($id) {
		// Delete Image First
		try {
			$this->News->deletePage($id);
			$this->Session->setFlash(__("Bài viết đã được xóa thành công!", true), "flash_success");
			$this->redirect(array(
				'action'	=>	'index',
				'root'		=>	$this->params['named']['root']
			));
		} catch (Exception $ex) {
			$this->Session->setFlash(__("Không thể xóa bài viết. Bạn vui lòng thử lại", true), "flash_error");
			$this->redirect(array(
				'action'	=>	'index',
				'root'		=>	$this->params['named']['root']
			));
		}
	}

	/**
	 * Phương thức được sử dụng để xóa hình ảnh của trang, bao gồm cả xóa thông tin dữ liệu và hình ảnh trên ổ cứng (kể cả thumbnail nếu có)
	 * @return unknown_type
	 */
	function delete_image() {
		if (isset($this->params['named']['page_id'])) {
			$id = intval($this->params['named']['page_id']);
			
			// Delete image in database
			$oldImage = $this->News->deleteImage($id);
			
			// Delete image in hard-disk
			$this->News->delete_image($oldImage, $this->configs);
			
			// redirect
			$this->Session->setFlash(__("Hình đại diện cho bài viết đã được xóa thành công!", true), "flash_success");
			$this->redirect(array(
				'action'=>'edit', 
				$id,
				'root'		=>	$this->params['named']['root']
			));
		} else {
			$this->Session->setFlash(__('Sai mã trang', true), "flash_error");
			$this->redirect(array(
				'action'=>'index',
				'root'		=>	$this->params['named']['root']
			));
		}
	}
	
	/**
	 * Phương thức được sử dụng để cập nhật lại thứ tự các trang (Mặc định của hệ thống là sắp xếp từ cao xuống thấp)
	 */
	function update_priority() {
		if (isset($_POST) && !empty($_POST)) {
			$this->data = array();
			foreach ($_POST['priority'] as $id => $item) {
				$this->data[]['News'] = array(
					'id'		=>	$id,
					'priority'	=>	$item
				);
			}

			$this->News->Behaviors->detach('Sluggable');
			$this->News->saveAll($this->data);
			$this->Session->setFlash(__("Độ ưu tiên đã được cập nhật!", true), "flash_success");
			
			if (isset($_SERVER['HTTP_REFERER'])) {
				$this->redirect($_SERVER['HTTP_REFERER']);
				//header("Location: ".$_SERVER['HTTP_REFERER']);
			} else {
				$this->redirect(array('action' => 'index'));
			}
		}
	}
	
	function mass_delete() {
		$checkboxes = array();
		if (isset($_POST['checkbox_index'])) {
			$checkboxes = $_POST['checkbox_index'];
		}
		if (count($checkboxes) > 0) {
			foreach ($checkboxes as $id) {
				$this->News->deletePage($id);
			}
			
			$this->Session->setFlash(__("Bài viết đã được xóa thành công!", true), "flash_success");
			$this->redirect(array(
				'action'	=>	'index',
				'root'		=>	$this->params['named']['root']
			));
		} else {
			$this->Session->setFlash(__("Bạn vui lòng chọn các bài viết cần xóa", true), "flash_error");
			$this->redirect(array(
				'action'	=>	'index',
				'root'		=>	$this->params['named']['root']
			));
		}
	}
	
	function publish() {
		$checkboxes = array();
		if (isset($_POST['checkbox_index'])) {
			$checkboxes = $_POST['checkbox_index'];
		}
		if (count($checkboxes) > 0) {
			foreach ($checkboxes as $id) {
				$this->News->updateAll(
					// fields
					array('is_published'	=> 1),
					
					// conditions
					array('News.id'	=> $checkboxes)
				);
			}
			
			$this->Session->setFlash(__("Các bài viết đã được kích hoạt!", true), "flash_success");
			$this->redirect(array(
				'action'	=>	'index',
				'root'		=>	$this->params['named']['root']
			));
		} else {
			$this->Session->setFlash(__("Bạn vui lòng chọn các bài viết cần kích hoạt", true), "flash_error");
			$this->redirect(array(
				'action'	=>	'index',
				'root'		=>	$this->params['named']['root']
			));
		}
	}
	function unpublish() {
		$checkboxes = array();
		if (isset($_POST['checkbox_index'])) {
			$checkboxes = $_POST['checkbox_index'];
		}
		if (count($checkboxes) > 0) {
			foreach ($checkboxes as $id) {
				$this->News->updateAll(
					// fields
					array('is_published'	=> 0),
					
					// conditions
					array('News.id'	=> $checkboxes)
				);
			}
			
			$this->Session->setFlash(__("Các bài viết đã được hủy kích hoạt!", true), "flash_success");
			$this->redirect(array(
				'action'	=>	'index',
				'root'		=>	$this->params['named']['root']
			));
		} else {
			$this->Session->setFlash(__("Bạn vui lòng chọn các bài viết cần hủy kích hoạt", true), "flash_error");
			$this->redirect(array(
				'action'	=>	'index',
				'root'		=>	$this->params['named']['root']
			));
		}
	}
}
?>